package com.example.myspringboot.config;

import com.example.myspringboot.anno.LogInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author cy
 * @date 2023/11/30
 */
@Configuration
public class WebMvnConfig implements WebMvcConfigurer {
    @Bean
    public HandlerInterceptor logInterceptor() {
        return new LogInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(logInterceptor()).addPathPatterns("/**");
    }

    /**
     * 配置CORS(Cross-Origin Resource Sharing)策略。
     * 该方法重写了WebMvcConfigurer接口的addCorsMappings方法，用于设置跨域资源共享规则。
     * 跨域资源共享是一种机制，允许Web端的应用程序访问不属于本域的资源。
     *
     * @param registry CORS配置注册表，通过该注册表可以添加和配置CORS映射。
     *                 这里使用了Spring MVC提供的CorsRegistry来添加CORS配置。
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 添加一个映射，使得所有路径都支持CORS。
        registry.addMapping("/**")
                // 允许所有来源访问，"*"表示不限制域名。
                .allowedOrigins("http://localhost:8174")
                // 允许GET、POST、PUT、DELETE和OPTIONS方法。
                // 这些方法是HTTP中最常用的方法，用于读取、创建、更新和删除资源。
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                // 允许所有请求头，"*"表示不限制请求头。
                .allowedHeaders("*")
                // 允许客户端在请求中包含凭证，如cookies和HTTP认证。
                // 这对于需要身份验证的跨域请求非常重要。
                .allowCredentials(true)
                // 设置预检请求（OPTIONS请求）的缓存时间，单位为秒。
                // 在这个时间段内，浏览器不需要再次发送预检请求，可以直接使用缓存的响应。
                .maxAge(3600);
    }

}
